package com.rabbit.service;

import com.rabbit.db.entity.User;
import com.rabbit.exception.BusinessException;
import com.rabbit.vo.req.MenuReq;
import com.rabbit.vo.res.MenuRes;
import com.rabbit.vo.res.MenuTreeRes;

import java.util.List;

/**
 * <h1>菜单业务接口</h1>
 *
 * @author zjw
 * @date 2022/1/14 14:31
 */
public interface MenuService {

    /**
     * 查询用户菜单
     *
     * @param user 用户
     * @return List<MenuRes> 菜单集合
     */
    List<MenuRes> queryUserMenu(User user);

    /**
     * 菜单列表查询
     *
     * @param menuReq 查询条件
     * @return List<MenuRes>  菜单集合
     */
    List<MenuRes> queryMenuList(MenuReq menuReq);

    /**
     * 树形菜单查询
     *
     * @param menuReq 查询条件
     * @return List<MenuTreeRes>  菜单集合
     */
    List<MenuTreeRes> queryMenuTree(MenuReq menuReq);

    /**
     * 查询指定菜单信息
     *
     * @param menuId 菜单编号
     * @return MenuRes
     */
    MenuRes queryMenuById(Long menuId);

    /**
     * 添加/更新时 数据校验
     *
     * @param menuReq  菜单添加/更新数据封装
     * @param operType 操作类型 1新增 2修改
     * @throws BusinessException 业务异常
     */
    void checkUnique(MenuReq menuReq, int operType) throws BusinessException;

    /**
     * 检查菜单能否删除
     *
     * @param menuReq 菜单信息
     * @throws BusinessException 业务异常
     */
    void checkCanBeDeleted(MenuReq menuReq) throws BusinessException;

    /**
     * 新增菜单
     *
     * @param menuReq 菜单信息
     */
    void addMenu(MenuReq menuReq);

    /**
     * 更新菜单
     *
     * @param menuReq 菜单信息
     */
    void updateMenu(MenuReq menuReq);

    /**
     * 删除菜单
     *
     * @param menuReq 菜单信息
     */
    void deleteMenu(MenuReq menuReq);
}
